﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Entities;
using System.Data.SqlClient;
using System.Data;
namespace AccesoDatos
{
    public class Clientes
    {
        public static void Insertar(Cliente cli, out int sFilasAfectadas)
        {
            sFilasAfectadas = 0;
            if (cli.IdCliente == 0)
            {
                //alta
                SqlConnection conexion = DB.Conectar();
                SqlTransaction trans = null;
                try
                {
                    //conexion.Open();
                    trans = conexion.BeginTransaction();
                    string comando = "INSERT INTO Cliente (nombre, apellido, idTipoDocumento, nroDocumento, idDomicilio, telFijo, telCelular, email) VALUES (@nombre,@apellido,@idTipoDoc,@nroDoc,@idDom,@telFijo,@telCel,@email)";
                    List<SqlParameter> lstParametros = new List<SqlParameter>();
                    lstParametros.Add(new SqlParameter("@nombre", cli.Nombre));
                    lstParametros.Add(new SqlParameter("@apellido", cli.Apellido));
                    lstParametros.Add(new SqlParameter("@idTipoDoc", cli.IdTipoDocumento));
                    lstParametros.Add(new SqlParameter("@nroDoc", cli.NroDocumento));
                    lstParametros.Add(new SqlParameter("@idDom", cli.IdDomicilio));
                    lstParametros.Add(new SqlParameter("@telFijo", cli.TelFijo));
                    lstParametros.Add(new SqlParameter("@telCel", cli.TelCelular));
                    lstParametros.Add(new SqlParameter("@email", cli.Email));
                    int filas = DB.EjecutarCommand(comando, lstParametros, conexion, trans);
                    if (filas > 0)
                    {
                        sFilasAfectadas = filas;
                        trans.Commit();
                    }
                }
                catch (Exception ex)
                {
                    if (trans != null)
                    {
                        trans.Rollback();
                    }
                    throw new Exception("No se pudo registrar el cliente");
                }
                finally
                {
                    if (conexion != null && conexion.State == ConnectionState.Open)
                        conexion.Close();
                }
            }
            else
            {
                //Modificar
                SqlConnection conexion = DB.Conectar();
                SqlTransaction trans = null;
                try
                {
                    //conexion.Open();
                    trans = conexion.BeginTransaction();
                    string comando = "UPDATE cliente SET nombre =@nombre, apellido =@apellido, idTipoDocumento =@idTipoDoc, nroDocumento =@nroDoc, idDomicilio =@idDom, telFijo =@telFijo, telCelular =@telCel, email =@email WHERE (idCliente = @id)";
                    List<SqlParameter> lstParametros = new List<SqlParameter>();
                    lstParametros.Add(new SqlParameter("@nombre", cli.Nombre));
                    lstParametros.Add(new SqlParameter("@apellido", cli.Apellido));
                    lstParametros.Add(new SqlParameter("@idTipoDoc", cli.IdTipoDocumento));
                    lstParametros.Add(new SqlParameter("@nroDoc", cli.NroDocumento));
                    lstParametros.Add(new SqlParameter("@idDom", cli.IdDomicilio));
                    lstParametros.Add(new SqlParameter("@telFijo", cli.TelFijo));
                    lstParametros.Add(new SqlParameter("@telCel", cli.TelCelular));
                    lstParametros.Add(new SqlParameter("@email", cli.Email));
                    lstParametros.Add(new SqlParameter("@id", cli.IdCliente));
                    int filas = DB.EjecutarCommand(comando, lstParametros, conexion, trans);
                    if (filas > 0)
                    {
                        sFilasAfectadas = filas;
                        trans.Commit();
                    }
                }
                catch (Exception ex)
                {
                    if (trans != null)
                    {
                        trans.Rollback();
                    }
                    throw new Exception("No se pudo modificar el cliente");
                }
                finally
                {
                    if (conexion != null && conexion.State == ConnectionState.Open)
                        conexion.Close();
                }
            }
        }
        public static void Eliminar(Cliente cli)
        {
            SqlConnection conexion = DB.Conectar();
            SqlTransaction trans = null;
            try
            {
                trans = conexion.BeginTransaction();
                string comando = "DELETE FROM cliente WHERE  (idCliente = @id)";
                List<SqlParameter> lstParametros = new List<SqlParameter>();
                lstParametros.Add(new SqlParameter("@id", cli.IdCliente));
                int afectadas = DB.EjecutarCommand(comando, lstParametros, conexion, trans);
                if (afectadas > 0)
                    trans.Commit();
            }
            catch (Exception)
            {
                if (trans != null)
                {
                    trans.Rollback();
                }
                throw new Exception("No se pudo dar de baja el cliente");
            }
            finally
            {
                if (conexion != null && conexion.State == ConnectionState.Open)
                    conexion.Close();
            }
        }
        public static int ObtenerUltimoID()
        {
            int id = -1;
            SqlConnection conexion = null;
            try
            {
                conexion = DB.Conectar();
                string comando = "select max(idCliente) as max from cliente";
                List<SqlParameter> lstParametros = new List<SqlParameter>();
                SqlDataReader dr = DB.GenerarReader(comando, lstParametros, conexion);
                List<Domicilio> lst = new List<Domicilio>();
                while (dr.Read())
                {
                    id = (int)dr["max"];
                }
            }
            catch (SqlException ex)
            {
                //Con throw la información de la pila es mas profunda de donde se genero el error
                //En la capa de Presentación se Captura como Exception
                throw new Exception("Hubo un problema al obtener el ultimo ID.", ex);
            }
            catch (Exception ex)
            {
                throw new Exception("Hubo un problema al obtener el ultimo ID.", ex);
            }
            finally
            {
                conexion.Close();
            }
            return id;
        }
        public static List<Cliente> ObtenerTodos()
        {
            List<Cliente> lstClientes = null;
            SqlConnection conexion = null;
            try
            {
                conexion = DB.Conectar();
                string comando = "SELECT idCliente,apellido,nombre,nroDocumento, idTipoDocumento FROM Cliente";
                List<SqlParameter> lstParametros = new List<SqlParameter>();
                SqlDataReader dr = DB.GenerarReader(comando, lstParametros, conexion);
                lstClientes = new List<Cliente>();
                Cliente oCliente;
                while (dr.Read())
                {
                    oCliente = new Cliente();
                    oCliente.IdCliente = (int)dr["idCliente"];
                    oCliente.Apellido = dr["apellido"].ToString();
                    oCliente.Nombre = dr["nombre"].ToString();
                    oCliente.NroDocumento = (int)dr["nroDocumento"];
                    oCliente.IdTipoDocumento = (int)dr["idTipoDocumento"];
                    lstClientes.Add(oCliente);
                    oCliente = null;
                }
            }
            catch (SqlException ex)
            {
                //Con throw la información de la pila es mas profunda de donde se genero el error
                //En la capa de Presentación se Captura como Exception
                throw new Exception("Hubo un problema al cargar los clientes.", ex);
            }
            catch (Exception ex)
            {
                throw new Exception("Hubo un problema al cargar los clientes.", ex);
            }
            finally
            {
                conexion.Close();
            }
            return lstClientes;
        }
        public static Cliente BuscarPorId(int id)
        {
            Cliente oCliente = null;
            SqlConnection conexion = null;
            try
            {
                conexion = DB.Conectar();
                string comando = "SELECT idCliente, nombre, apellido, idTipoDocumento, nroDocumento, idDomicilio, telFijo, telCelular, email FROM Cliente Where idCliente = @id";
                List<SqlParameter> lstParametros = new List<SqlParameter>();
                lstParametros.Add(new SqlParameter("@id", id));
                SqlDataReader dr = DB.GenerarReader(comando, lstParametros, conexion);
                while (dr.Read())
                {
                    oCliente = new Cliente();
                    oCliente.IdCliente = (int)dr["idCliente"];
                    oCliente.Apellido = dr["apellido"].ToString();
                    oCliente.Nombre = dr["nombre"].ToString();
                    oCliente.NroDocumento = (int)dr["nroDocumento"];
                    oCliente.IdTipoDocumento = (int)dr["idTipoDocumento"];
                    oCliente.IdDomicilio = (int)dr["idDomicilio"];
                    if (dr["telFijo"] != DBNull.Value)
                        oCliente.TelFijo = (int)dr["telFijo"];
                    else
                        oCliente.TelFijo = null;
                    if (dr["telCelular"] != DBNull.Value)
                        oCliente.TelCelular = (int)dr["telCelular"];
                    else
                        oCliente.TelCelular = null;
                    if (dr["email"] != DBNull.Value)
                        oCliente.Email = dr["email"].ToString();
                    else
                        oCliente.Email = null;
                }
            }
            catch (SqlException ex)
            {
                //Con throw la información de la pila es mas profunda de donde se genero el error
                //En la capa de Presentación se Captura como Exception
                throw new Exception("Hubo un problema al cargar el cliente.", ex);
            }
            catch (Exception ex)
            {
                throw new Exception("Hubo un problema al cargar el cliente.", ex);
            }
            finally
            {
                conexion.Close();
            }
            return oCliente;
        }
        public static Cliente BuscarPorDni(int dni)
        {
            Cliente oCliente = null;
            SqlConnection conexion = null;
            try
            {
                conexion = DB.Conectar();

                string comando = "SELECT idCliente, nombre, apellido, idTipoDocumento, nroDocumento, idDomicilio, telFijo, telCelular, email FROM Cliente Where nroDocumento = @dni";
                List<SqlParameter> lstParametros = new List<SqlParameter>();
                lstParametros.Add(new SqlParameter("@dni", dni));
                SqlDataReader dr = DB.GenerarReader(comando, lstParametros, conexion);
                while (dr.Read())
                {
                    oCliente = new Cliente();
                    oCliente.IdCliente = (int)dr["idCliente"];
                    oCliente.Apellido = dr["apellido"].ToString();
                    oCliente.Nombre = dr["nombre"].ToString();
                    oCliente.NroDocumento = (int)dr["nroDocumento"];
                    oCliente.IdTipoDocumento = (int)dr["idTipoDocumento"];
                    oCliente.IdDomicilio = (int)dr["idDomicilio"];
                    if (dr["telFijo"] != DBNull.Value)
                        oCliente.TelFijo = (int)dr["telFijo"];
                    else
                        oCliente.TelFijo = null;
                    if (dr["telCelular"] != DBNull.Value)
                        oCliente.TelCelular = (int)dr["telCelular"];
                    else
                        oCliente.TelCelular = null;
                    if (dr["email"] != DBNull.Value)
                        oCliente.Email = dr["email"].ToString();
                    else
                        oCliente.Email = null;
                }
            }
            catch (SqlException ex)
            {
                //Con throw la información de la pila es mas profunda de donde se genero el error
                //En la capa de Presentación se Captura como Exception
                throw new Exception("Hubo un problema al cargar el cliente.", ex);
            }
            catch (Exception ex)
            {
                throw new Exception("Hubo un problema al cargar el cliente.", ex);
            }
            finally
            {
                conexion.Close();
            }

            return oCliente;
        }
        public static List<Cliente> ObtenerTodosClientes(string nombre, string apellido, int? nroDoc, int? tipoDoc, int? idCliente)
        {
            SqlConnection conexion = null;
            List<Cliente> lstClientes = null;
            try
            {
                conexion = DB.Conectar();
                string comando = "SELECT TOP 1000 idCliente, nombre, apellido, idTipoDocumento, nroDocumento, idDomicilio, telFijo, telCelular, email FROM Cliente where 1=1";
                List<SqlParameter> lstParametros = new List<SqlParameter>();
                if (!string.IsNullOrEmpty(nombre))
                {
                    comando += " and nombre like @nombre";
                    lstParametros.Add(new SqlParameter("@nombre", '%' + nombre + '%'));
                }
                if (!string.IsNullOrEmpty(apellido))
                {
                    comando += " and apellido like @apellido";
                    lstParametros.Add(new SqlParameter("@apellido", '%' + apellido + '%'));
                }
                if (tipoDoc != null || tipoDoc > 0)
                {
                    comando += " and idTipoDocumento = @tipoDoc";
                    lstParametros.Add(new SqlParameter("@tipoDoc", tipoDoc));
                }
                if (nroDoc != null || nroDoc > 0)
                {
                    comando += " and nroDocumento = @nroDoc";
                    lstParametros.Add(new SqlParameter("@nroDoc", nroDoc));
                }
                if (idCliente != null || idCliente > 0)
                {
                    comando += " and idCliente = @idCliente";
                    lstParametros.Add(new SqlParameter("@idCliente", idCliente));
                }
                SqlDataReader dr = DB.GenerarReader(comando, lstParametros, conexion);
                //List<Cliente> lstClientes = new List<Cliente>();
                lstClientes = new List<Cliente>();
                Cliente oCliente;
                while (dr.Read())
                {
                    oCliente = new Cliente();
                    oCliente.IdCliente = (int)dr["idCliente"];
                    oCliente.Apellido = dr["apellido"].ToString();
                    oCliente.Nombre = dr["nombre"].ToString();
                    oCliente.NroDocumento = (int)dr["nroDocumento"];
                    oCliente.IdTipoDocumento = (int)dr["idTipoDocumento"];
                    oCliente.IdDomicilio = (int)dr["idDomicilio"];
                    if (dr["telFijo"] != DBNull.Value)
                        oCliente.TelFijo = (int)dr["telFijo"];
                    else
                        oCliente.TelFijo = null;
                    if (dr["telCelular"] != DBNull.Value)
                        oCliente.TelCelular = (int)dr["telCelular"];
                    else
                        oCliente.TelCelular = null;
                    if (dr["email"] != DBNull.Value)
                        oCliente.Email = dr["email"].ToString();
                    else
                        oCliente.Email = null;
                    lstClientes.Add(oCliente);
                    oCliente = null;
                }
            }
            catch (SqlException ex)
            {
                //Con throw la información de la pila es mas profunda de donde se genero el error
                //En la capa de Presentación se Captura como Exception
                throw new Exception("Hubo un problema al cargar los clientes.", ex);
            }
            catch (Exception ex)
            {
                throw new Exception("Hubo un problema al cargar los clientes.", ex);
            }
            finally
            {
                conexion.Close();
            }
            return lstClientes;
        }
        public static List<Cliente> ObtenerTodosOrdenados(string criterio, string direccion)
        {
            List<Cliente> lstClientes = null;
            SqlConnection conexion = null;
            try
            {
                conexion = DB.Conectar();
                string comando = "SELECT idCliente,apellido,nombre,nroDocumento, idTipoDocumento FROM Cliente order by " + criterio+" "+direccion;
                List<SqlParameter> lstParametros = new List<SqlParameter>();
                SqlDataReader dr = DB.GenerarReader(comando, lstParametros, conexion);
                lstClientes = new List<Cliente>();
                Cliente oCliente;
                while (dr.Read())
                {
                    oCliente = new Cliente();
                    oCliente.IdCliente = (int)dr["idCliente"];
                    oCliente.Apellido = dr["apellido"].ToString();
                    oCliente.Nombre = dr["nombre"].ToString();
                    oCliente.NroDocumento = (int)dr["nroDocumento"];
                    oCliente.IdTipoDocumento = (int)dr["idTipoDocumento"];
                    lstClientes.Add(oCliente);
                    oCliente = null;
                }
            }
            catch (SqlException ex)
            {
                //Con throw la información de la pila es mas profunda de donde se genero el error
                //En la capa de Presentación se Captura como Exception
                throw new Exception("Hubo un problema al cargar los clientes.", ex);
            }
            catch (Exception ex)
            {
                throw new Exception("Hubo un problema al cargar los clientes.", ex);
            }
            finally
            {
                conexion.Close();
            }           
            return lstClientes;
        }
        public static List<Cliente> ObtenerTodosClientesFiltradosOrdenados(string nombre, string apellido, int? nroDoc, int? tipoDoc, string criterio, string direccion)
        {
            SqlConnection conexion = null;
            List<Cliente> lstClientes = null;
            try
            {
                conexion = DB.Conectar();
                string comando = "SELECT TOP 1000 idCliente, nombre, apellido, idTipoDocumento, nroDocumento, idDomicilio, telFijo, telCelular, email FROM Cliente where 1=1";
                List<SqlParameter> lstParametros = new List<SqlParameter>();
                if (!string.IsNullOrEmpty(nombre))
                {
                    comando += " and nombre like @nombre";
                    lstParametros.Add(new SqlParameter("@nombre", '%' + nombre + '%'));
                }
                if (!string.IsNullOrEmpty(apellido))
                {
                    comando += " and apellido like @apellido";
                    lstParametros.Add(new SqlParameter("@apellido", '%' + apellido + '%'));
                }
                if (tipoDoc != null || tipoDoc > 0)
                {
                    comando += " and idTipoDocumento = @tipoDoc";
                    lstParametros.Add(new SqlParameter("@tipoDoc", tipoDoc));
                }
                if (nroDoc != null || nroDoc > 0)
                {
                    comando += " and nroDocumento = @nroDoc";
                    lstParametros.Add(new SqlParameter("@nroDoc", nroDoc));
                }
                comando += " order by " + criterio +" " + direccion;
                SqlDataReader dr = DB.GenerarReader(comando, lstParametros, conexion);
                lstClientes = new List<Cliente>();
                Cliente oCliente;
                while (dr.Read())
                {
                    oCliente = new Cliente();
                    oCliente.IdCliente = (int)dr["idCliente"];
                    oCliente.Apellido = dr["apellido"].ToString();
                    oCliente.Nombre = dr["nombre"].ToString();
                    oCliente.NroDocumento = (int)dr["nroDocumento"];
                    oCliente.IdTipoDocumento = (int)dr["idTipoDocumento"];
                    oCliente.IdDomicilio = (int)dr["idDomicilio"];
                    if (dr["telFijo"] != DBNull.Value)
                        oCliente.TelFijo = (int)dr["telFijo"];
                    else
                        oCliente.TelFijo = null;
                    if (dr["telCelular"] != DBNull.Value)
                        oCliente.TelCelular = (int)dr["telCelular"];
                    else
                        oCliente.TelCelular = null;
                    if (dr["email"] != DBNull.Value)
                        oCliente.Email = dr["email"].ToString();
                    else
                        oCliente.Email = null;
                    lstClientes.Add(oCliente);
                    oCliente = null;
                }
            }
            catch (SqlException ex)
            {
                //Con throw la información de la pila es mas profunda de donde se genero el error
                //En la capa de Presentación se Captura como Exception
                throw new Exception("Hubo un problema al cargar los clientes.", ex);
            }
            catch (Exception ex)
            {
                throw new Exception("Hubo un problema al cargar los clientes.", ex);
            }
            finally
            {
                conexion.Close();
            }
            return lstClientes;
        }
    }
}
